/**
 * @description 绑定事件
 * @param element 需要绑定事件的元素
 * @param event   事件类型
 * @param handler 执行方法
 * @param {boolean} [bool = false]  是否事件冒泡
 */
export function onEvent(element, event, handler, bool = false) {
  if (!element || !event || !handler) return
  if (document.addEventListener) {
    element.addEventListener(event, handler, bool)
  } else {
    element.attachEvent(`on${event}`, handler)
  }
}

/**
   * @description 解绑事件
   */
export function offEvent(element, event, handler) {
  if (!element || !event) return
  if (document.removeEventListener) {
    element.removeEventListener(event, handler)
  } else {
    element.detachEvent(`on${event}`, handler)
  }
}

/**
   *
   * @param {Number} disX 横向滚动距离
   * @param {Number} disY 纵向滚动距离
   */
export function scrollWindow(disX = 0, disY = 0) {
  window.scrollTo(disX, disY)
}

/**
   * @description 设置localSroage
   * @param {String} key localSroage key值
   * @param {*} value localSroage value值
   */
export function setLocalStorage(key, value) {
  localStorage.setItem(key, JSON.stringify(value))
}

/**
   * @description 获取localSroage
   * @param {*} key localSroage key值
   */
export function getLocalStorage(key) {
  return JSON.parse(localStorage.getItem(key))
}

/**
   * @description 时间格式化
   * @param {String} timestamp 时间
   * @param {String} fmt 时间格式
   */
export function formatDate(timestamp = new Date().valueOf(), fmt = 'yyyy-MM-dd hh:mm:ss') {
  if (typeof timestamp === 'string') {
    timestamp = parseInt(timestamp, 10)
  }
  const date = new Date(timestamp)
  if (date.toString() === 'Invalid Date') {
    return 'Invalid Date'
  }
  const o = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
    'H+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    S: date.getMilliseconds() // 毫秒
  }

  const week = {
    0: '/u65e5',
    1: '/u4e00',
    2: '/u4e8c',
    3: '/u4e09',
    4: '/u56db',
    5: '/u4e94',
    6: '/u516d'
  }

  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (`${date.getFullYear()}`).substr(4 - RegExp.$1.length))
  }
  if (/(E+)/.test(fmt)) {
    // eslint-disable-next-line no-nested-ternary
    fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '/u661f/u671f' : '/u5468') : '') + week[`${date.getDay()}`])
  }
  // eslint-disable-next-line no-restricted-syntax
  for (const k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : ((`00${o[k]}`).substr((`${o[k]}`).length)))
    }
  }
  return fmt
}

/**
   * @description 下拉操作
   * @param {Object} el 下拉元素的dom对象
   * @param {String} className 样式类名
   */
export function dropUp(el, delay = 1000) {
  if (!el) return
  console.log(delay)
  el.style.display = 'block'
}

/**
   * @description 上拉操作
   * @param {Object} el 上拉元素的dom对象
   * @param {String} className 样式类名
   * @param {Numebr} delay 延迟时间
   */
export function pullUp(el, className, delay = 1000) {
  if (!el || !className) return
  el.classList.add(className)
  setTimeout(() => {
    el.style.display = 'none'
  }, delay)
}

/**
   * @description 函数节流
   * @param {*} func 执行方法
   * @param {*} time 节流时间
   */
export function throttle(func, time = 20) {
  let timeout = null
  let startTime = new Date()
  const that = this
  // eslint-disable-next-line prefer-rest-params
  const args = arguments
  return () => {
    const currentTime = new Date()
    clearTimeout(timeout)
    if (currentTime - startTime > time) {
      func.apply(that, args)
      startTime = currentTime
    } else {
      timeout = setTimeout(() => {
        func.apply(that, args)
      }, time)
    }
  }
}
